{\rtf1\ansi\ansicpg1252\deff0\deflang4105{\fonttbl{\f0\fmodern\fprq1\fcharset0 Courier New;}{\f1\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\nowidctlpar\qc\b\f0\fs20 Table of Contents\b0\par
\pard\nowidctlpar\ul 1 Purpose of This Document\par
2 Writing the Config File\par
3 Boolean Logic\par
\ulnone\tab\ul 3.1 Basics\par
\ulnone\tab\ul 3.2 Computerized\par
\ulnone\tab\ul 3.3 Complexities\par
\ulnone\tab\ul 3.4 Negatives\par
\ulnone\tab\ul 3.5 Pulling it Together, PRAP Specifics\par
4 Possible Problems and Fixes\par
5 Examples\par
\ulnone\tab\ul 5.1 Config File\par
\ulnone\tab\ul 5.2 Multiple Section Similarities\ulnone\par
\par
\par
\par
\par
\b\fs28 Purpose of This Document\b0\fs20\par
The intent of this documentation is to lay the groundwork for any logical thinking required to run the program, as well as any technical difficulties that might be encountered.\par
\par
In essence:\par
"Learn to use the PR Automation Program (PRAP) effectively"\par
\par
\par
\b\fs28 Writing the Config File\b0\fs20\par
There are two main things to consider when writing the config file. How you want the PRs handled the first time the program is run, and how it will be handled a second time. Doing either is easy, but doing them both can be very complex, depending on how it needs to be handled.\par
\par
The program was originally created to handle some very complex PRs, so it\rquote s been made with the ability to handle pretty much anything thrown at it. While thinking is a good thing, learning to write the config file is the only thinking required part.\par
 \par
First the groundwork of the config file all at once, and then a step by step breakdown of what each part entails. After that, we will introduce some possible complexities and ways you can handle them.\par
\par
http://przilla.ott.qnx.com/bugzilla/buglist.cgi?[QUERY]\par
PR_Zilla_User_Name\par
PR_Zilla_Password\par
sgm_file.sgm\par
Old_Version_Number#\par
New_Version_Number#\par
(List of Headers, Search Status, Remove Clause)\par
\par
When you first want to update your documentation, you need a PRzilla search query. You can do any search query like you normally would at http://przilla.ott.qnx.com/bugzilla/query.cgi and generate the search. Copy the URL after you've clicked 'Search'. This is the GET data (if your familiar with HTML forms) used by the PRzilla to generate your search. The PRAP also uses this GET data to generate a search.\par
\par
Don't worry if the url is extremely long; there is a lot of GET data that needs to be sent to do a complex (or simple) PR search.\par
\par
Next you have to enter two lines; your username and password. Without finding a security weakness in the database PRzilla requires a valid username and password to access the data. While there may be a hole, if I were to find one, I would probably make report and it would get fixed. So first enter your username, and on the next line enter your password.\par
\par
The fourth/next line is the SGM file. This needs to be a local file. So wherever you have the PRAP, there needs to be the file. You just need to enter its filename.\par
\par
The next two lines are the previous version and the new version. These are used to handle the more complex cases. PRs in the SGM file without a commented timestamp tag will be processed as having an 'old' timestamp.\par
\par
It is important to know that the first time you run PRAP on the SGM, everything will not have a new timestamp (They will either be the 'old'(almost always), an even older one (rare), or have no timestamp at all). So keep this in mind when doing comparisons (which are explained in \b Boolean Logic - Pulling it Together, PRAP Specifics\b0 )\par
\par
Now I don't see a reason where you would need to specify ==Old, however I've kept it in case its required. Normally you can use ==New, or more commonly !=New (Which will handle all three cases I mentioned above).\par
\par
All that I've explained is the standard configuration file data. The next part is fairly simple, but requires all the thinking. The majority of this documentation is centered around generating this section.\par
\par
\b\fs22 List of Headers, Search Status, and Remove Clause\b0\fs20\par
A header, search status, and remove clause look like this:\par
\par
Header_Name_In_SGM\par
Add: _comparison_\par
#\par
\par
In the SGM file, you have different headers. Here is some sample SGML Code: <h3 id="new_fix">Fixed in this release</h3>\par
\par
So the header here would be, without quotes, "Fixed in this release". The PRs would then be stored as "<li>ID $mdash; Synopsis", inside of the next <ul></ul> tags after the header. Example:\par
\par
\i <h3 id="new_fix">Fixed in this release</h3>\par
<p>his section lists issues that have been fixed, but for which testing has not been completed at time of this release.\par
<ul>\par
\tab <li>56791 &mdash; Some synopsis<!--timestamp='12.9.6'-->\par
\tab <li>56234 &mdash; Woot this is a synopsis\par
<p>\par
\tab <li>52582 &mdash; Oh no I'm on my own!..And I'm a synopsis, btw\par
</ul>\i0\par
\par
Also note the timestamp in the first entry, the other two will be treated as if they are an old timestamp, which is whatever is set in the config file (though technically they can be set as anything other then New).\par
\par
The next line after a header is the add line. It is the word Add with a colon and a space (case sensitive). Originally the configuration file was a little more complex, and required different start tags (Add:, Remove:, Keep:, etc) but it the program took advantage of many patterns to do all of that behind the scenes. Add was kept as an aesthetic, it makes the config look less mechanical.\par
\par
The _comparison_ is criteria for what PRs should be added under each header. This is explained in great detail in the Boolean Logic sections, though more specific to the config file itself in \b Boolean Logic - Pulling it Together, PRAP Specifics\b0 .\par
\par
If search criteria under two headers would include the same PR (typically this happens with OR clauses [or ||, see \b Boolean Logic - Computerized\b0 ], which include things when they shouldn't), you may end up with the same PR under different headers. This is a logical error talked about in great detail under \b Possible Problems\b0  under problem 2. If a header contains all VALI, make sure to put !=VALI for other headers (when necessary). Most of the time you won't need to, but it really depends on the situation.\par
\par
Heading_1\par
(Status==VERI)\par
\par
Heading_2\par
(Status==RESO)\par
\par
That situation would make no sense to have Header_2 as;\par
\par
(Status==RESO && Status!=VERI)\par
\par
The reason is, Status already has to be RESO, so if its RESO you don't need to say "Don't be VERI", that\rquote s already true. If its not RESO, the clause won't be true, so whether its VERI or not is irrelevant.\par
\par
The more headers, the more complex it becomes. Keep it as simple as possible and you'll make it through (Normally you make a config file once, and you only need to update if you make format changes to the config file, like adding a new header or changing what goes where).\par
\par
The final part is the Remove Clause. This is one of two things; 0 or 1. Technically you can use anything other then 0 and it will act as 1, but the format is to use 1 or 0.\par
\par
This part of the config file tells the program whether to remove old PRs from this list. So if a PR with remove clause 1 has PRs with an old timestamp, it will be removed from the documentation. Remove does not mean 'remove from this section', that is handled implicitly. It means 'Remove all old PRs in this header from documentation'.\par
\par
The part of about 'all old PRs' means to say, if you run a program again, it won't remove newly moved PRs. This is important, because if you are just looking to look for any changes by running the program again, you do not want to remove PRs that you only just added to the documentation.\par
\par
This would mean you are working on say release 12.9.5 and you've run it a bunch of times. The first time, it removed all specified PRs from the documentation, and then moved all newly updated PRs to that section. When you run it a second time, you don't want them to be removed until you are working on the next release 12.9.6. This is the primary purpose of the Timestamp; to prevent unnecessary termination, baby.\par
\par
\b\fs28 Boolean Logic - Basics\b0\fs20\par
This section attempts to explain what Boolean logic is, as well as outlining some pitfalls that can lead to some serious trouble if they aren't seen.\par
\par
A Boolean value, sometimes referred to as a bool, is one of two values. Typically true or false, though Boolean\rquote s can be any two values; but only two. 0 and 1 are famous Boolean values.\par
\par
When you evaluate an argument, it\rquote s actually a process of breaking an argument it down into a Boolean. It\rquote s either true or false. So let\rquote s say we have this argument;\par
\par
5=4\par
\par
This entire argument evaluates to false, because five isn't equal to four. We will call that entire part, a point. Meaning, 5=4 is a point in the argument. To clarify;\par
\par
5=4 and 6=6\par
\par
Has two points. 5=4 is one, and 6=6 is another. Now lets break it down;\par
\par
5=4 and 6=6\par
false and true\par
\par
Now, we have evaluated these two points to their Boolean values, but there is a problem. What is 'false and true' as a Boolean? What we have is a Boolean, a clause, and another Boolean.\par
\par
So Boolean logic, so far, has two parts: points/Booleans, and clauses. A clause is something that makes 'choices' based on Boolean values around it.\par
\par
The above argument of 'false and true' evaluates to a Boolean of false. What and says is, "are both Booleans true? If so, then I evaluate them to true. For any other case, they are false". I will break it down and explain.\par
\par
false and false = false\par
false and true  = false\par
true  and false = false\par
true  and true  = true\par
\par
This means, an and clause will always evaluate to false unless both Booleans are true. So;\par
\par
5=4 and 6=6\par
\par
Is like saying, "Five is equal to four, and six is equal to six", which is obviously a false argument. We can say it\rquote s false, because the point that five is equal to four is false.\par
\par
There is another clause as well,\par
\par
5=4 or 6=6\par
false or true\par
\par
Here we have the 'or' clause. For another chart like before;\par
\par
false or false = false\par
false or true  = true\par
true  or false = true\par
true  or true  = true\par
\par
You can think of the or clause as "If either one is true, then I evaluate to true", or, "I only evaluate to false if both Boolean values are false". Thus our argument will evaluate to true, because six is equal to six.\par
\par
You now have the basics of Boolean logic (theory).\par
\par
\par
\b\fs28 Boolean Logic - Computerized\b0\fs20\par
You should read "Boolean Logic - Basics" if you are unfamiliar with what Boolean logic is. Terminology used, compared to the following argument:\par
\par
10=3 or 5=7\par
\par
The entire line is called an argument. '10=3' is called a point, and so is '5=7'. 'or' is called a clause. When you break down a point into a Boolean, its considered 'evaluating' the point. The entire process is called 'evaluating the argument'.\par
\par
Boolean logic in computers is extremely important. On the most basic level, all a computer can do is add, subtract, and check if two numbers are equal, less then each other, or greater then each other. \par
\par
When two numbers are compared (equal, less than, greater than), a value is returned (1 for true, 0 for false). So an argument can be broken down like so;\par
\par
123=412 or 10>9\par
false or true\par
true\par
\par
OR\par
\par
123=412 or 10>9\par
0 or 1\par
1\par
\par
The first being what we were introduced to in "Boolean Logic - Basics". This is still an abstraction, however we won't worry about that here.\par
\par
For the purpose's of this documentation, the word 'or' and \par
'and' don't exist. Instead we have || and &&. (Imagine explaining that without the word and. 'Instead we have ||&&&&'). That is to say, and is &&, and or is ||.\par
\par
and -> &&\par
or  -> ||\par
\par
These are symbols. Here are some human to computer examples:\par
\par
Human:\tab\tab\tab\tab\tab Computer:\par
50=70 and 2=2\tab\tab\tab\tab 50=70 && 2=2\par
100>2 or 2>100\tab\tab\tab\tab 100>2 || 2>100\par
1=2 or 2=3 or 5=6\tab\tab\tab\tab 1=2 || 2=3 || 5=6\par
1=1 and 2=2 and (5=5 or 6>3)\tab\tab 1=1 && 2=2 && (5=5 || 6>3)\par
\par
Its not complex, but its important. Some languages understand or and and, but you get to use || and && instead, aren't you lucky.\par
\par
Now I introduced two more things (Brackets and more than one clause) to lead into the next section of '\b Boolean Logic - Complexities\b0 '. While it doesn't start complex, it does get into some situations where your mind can bend in on itself and implode. You know, metaphorically speaking.\par
\par
\par
\b\fs28 Boolean Logic - Complexities\b0\fs20\par
This section will assume you've read '\b Boolean Logic - Basics\b0 ', and '\b Boolean Logic - Computerized\b0 '.\par
\par
\b\fs24 Multiple Clauses\b0\fs20\par
10=10 && 5>3 && 6=2 || 5=5\par
\par
Lets break it down, and then I'll explain it.\par
\par
10=10 && 5>3 && 6=2 || 5=5\par
1 && 1 && 0 || 1\par
1 && 0 || 1\par
0 || 1\par
1\par
\par
Now, it looks like gibberish at first, but lets go through it. Firstly, I evaluated all the points, and ignored the clause (Technically, points don't need to be evaluate until the 'last minute', but it makes the explanation easier).\par
\par
Boolean logic is *always* evaluated from left to right (for the purposes of this document).\par
Start: 1 && 1 && 0 || 1\par
So you look at 1 && 1, it evaluates to 1.\par
\par
Now: 1 && 0 || 1\par
Look at 1 && 0, evaluates to 0.\par
\par
Now 0 || 1\par
Look at 0 || 1, evaluates to 1.\par
\par
Evaluation: 1\par
\par
Multiple clauses are simple. Left to right, always left to right.\par
\par
\b\fs24 Brackets\b0\fs20\par
Brackets affect order of operations. As I said before, we evaluate from left to right. If we encounter an open bracket, we evaluate everything inside that set of brackets before we evaluate the clause (if there is one) linking the bracket and the previous value.\par
\par
\b Example 1:\b0\par
 - true && (false || true)\par
 - true && (true)\par
 - true\par
\par
\b Example 2:\b0\par
 - (true || (true && false)) && (false || (false && false) || (true || true || true || false))\par
 - true && (false || (false && false) || (true || true || true || false))\par
 - true && (false || false || (true || true || true || false))\par
 - true && (false || false || true)\par
 - true && true\par
 - true\par
\par
While all the && and || and brackets might be confusing, just remember all the rules and apply them like normal. Ignore brackets until you encounter an open brackets. If you have true || ANYTHING you can get rid of the anything and just have true. The reason, is that only one thing needs to be true for the entire thing to be true. This makes evaluating brackets simpler.\par
\par
true || (false || (false && false) || (true && true))\par
true\par
\par
It also works for the and clause, but opposite. If the first value is false, then evaluate the entire thing to false. This works because and implies "everything must be true to evaluate true, else false".\par
\par
false && (false || (false && false) || (true && true))\par
false\par
\par
Now you have some understanding of the complex parts of Boolean logic. However, there is still negative values to think about. Don't worry, I  have a simple way of thinking about it.\par
\par
\par
\b\fs28 Boolean Logic - Negatives\b0\fs20\par
Negative values are typically treated with a shriek and fleeing in terror. But that doesn't have to be the case. Lets take the easy road instead (I won't even explain the hard roads of charts and graphs).\par
\par
!true\par
false\par
\par
Typically the exclamation point is the symbol for negative (in Boolean logic, negative numbers still use the -# format). Some languages also use '~' (near the 1 on a qwerty keyboard setup) for negatives, but we are going to use the exclamation point.\par
\par
I think about a negative value as simply changing true to false, and false to true. What\rquote s the negative of a positive number? Well a negative number. What\rquote s the negative of a negative number? Of course, its a positive. The negative of a number switches the sign. Its no different in Boolean logic.\par
\par
Normally negatives are taught as 'searching for a negative rather then positive'. When can get confusing, especially if you deal with languages that support 'unless', which already looks for a false value. So using a ! will result in, "Searching for a false value to return a false value that\rquote s not false". Its easier to say "Search for a false value, switch the last value". Lets have some examples.\par
\par
!(true && (false || false || (true || true || true || false)))\par
!(true && (false || false || true))\par
!(true && true)\par
!(true)\par
false\par
\par
!(true && false)\par
!(false)\par
true\par
\par
\b Quick chart:\b0\par
!true = false\par
!false = true\par
\par
Simple, no?\par
\par
\par
\b\fs28 Boolean Logic - Pulling it Together, PRAP Specifics\b0\fs20\par
Now that you have a very solid knowledge of Boolean logic, it will be simple to apply this to your config files for PR updates.\par
\par
There are four different values you can use, each with possible outcomes.\par
\par
Status\tab : REOP ACCE RESO VERI CLOS NONE NEW\par
Resolution\tab : FIXE INVA NOIN DUPL UNRE NONE\par
Assigned-To\tab : HBAS !HBAS\par
Timestamp\tab : old current\par
\par
Values are Status, Resolution, Assigned-To, and Timestamp. Case sensitivity and symbols are important. If they aren't exact it won't match.\par
\par
Each of the values represent the values contained in all PRs. So if you want all PRs with Status REOP, then you write:\par
\par
Status==REOP\par
\par
or\par
\par
REOP==Status\par
\par
Though the 'proper format' is to put the PR value first, either will work.\par
\par
With a little more complexity, lets say you want PRs in a certain section to have a RESO or ACCE status, and have FIXE or NOIN resolution. Also, it won't be HBAS.\par
\par
(Status==RESO || Status==ACCE) && (Resolution==FIXE || Resolution=NOIN) && ('Assigned-To'!='hbas_support_contact@qnx.com')\par
\par
Note: This is a single line, regardless of how it looks with the word-wrap.\par
\par
Notice my use of brackets. This line will evaluate the same regardless of whether I put them in brackets, however for formatting it makes it easier to read. Typically each value for its possible value is put in brackets, but it will work either way. \par
\par
Also take note two things. Firstly, the single quotes around Assigned-To and the email address. Note that both things contain symbols. This is not an accident. Any set of characters may be enclosed in single quotes and treated as pure text (except for single quotes). Which is also to say, that anything with a symbol (an email address for example) must be enclosed in quotes. This tells the program to ignore all symbols.\par
\par
Secondly, the != and ==. Comparisons are done using double equal signs (I used single equals before because it was done more mathematically than scripty). If you use a single equal sign, the program will attempt to assign a value and return 1 if it\rquote s successful, or 0 otherwise. Which means you will technically get back Boolean values, but not (necessarily) the ones you want (Will generally always fail, i.e. return 0).\par
\par
Handling timestamps isn't necessary for normal line clauses, and is only necessary to use for the remove clause. However, they are handled like so;\par
\par
Timestamp==Old\par
Timestamp==New\par
Timestamp!=Old\par
Timestamp!=New\par
\par
New and Old are keywords. Old being the previous version, New being the current version. ==Old and !=New are typically the same thing, since you normally deal with two timestamps. However, to avoid any PRs that are neither the same as New or Old, it is suggested to use '!=' rather then '==' (without quotes). Examples:\par
\par
Old= 12.9.6\par
New= 12.9.7\par
TimeStamp1= 12.9.6\par
TimeStamp2= 12.9.3\par
\par
TimeStamp1==Old => true\par
TimeStamp1!=New => true\par
\par
Timestamp2==Old => false\par
TimeStamp2!=New => true\par
\par
Now, of course the question is, "If !=New is more reliable, why even have Old?" Typically you won't need to use ==Old, but its in here incase its needed logically.\par
\par
\par
\b\fs28 Possible Problems and Fixes\par
\fs20 Check here first if there is undesirable output for a possible reason.\fs24\par
\b0\fs20\par
 1. If there was another set of <ul></ul> tags in between the header and the desired list of PRs, it would look for PRs in there instead. There is no situation where this should be the case, but should be kept in mind if you see an extra list popping up for no reason in the SGM file (It will also write PRs to that list, and try to remove PRs from it).\par
\par
\pard\nowidctlpar\qc - - -\par
\pard\nowidctlpar\par
 2. Same PR under multiple headers. This commonly happens when there is a problem with the search criteria. A number of things can cause it, but they all suggest that either the logic was wrong, or the line was written incorrectly (most commonly, mixing up || and &&, or a misplaced bracket). Sometimes the logic seems correct, but the two headers contain logic that are valid for the same PR (resulting in it being put in twice).\par
\par
Of course the program could be rewritten to only include it once, but which header should have precedence? There shouldn't logically be, unless its desired, a case where a PR will fall under two headers, so if there is a case where a PR appears in two headers, you know something\rquote s wrong.\par
\par
A good way to fix this is to look up the PR in PRzilla, and ask why it was valid for more than one search criteria. "Why does it satisfy both criteria?" This will tell you what has gone wrong.\par
\par
Note: A very rare case will be that between finding the error and looking up the PR, that it will change status. Be aware of this if you start banging your head against the desk. Run the program again and see if the same thing happens (Though if your having a bad day, someone might update the PR right before you test it).\par
\par
\pard\nowidctlpar\qc - - -\par
\pard\nowidctlpar\par
 3. asd\par
\pard\f1\par
\b\fs28 Examples - Config File\b0\fs20\par
Here is a sample config file. The logic here is not complete, its merely a quick reference to the format. I've made the URL very small font, since its very, very long (Over 5000 characters).\par
\par
Note: It may appear to look like multiple lines for the add clauses, but this is not the case. This is due to line wrap (unless you reading this in a program without word wrap).\par
\par
\i\fs8 http://przilla.ott.qnx.com/bugzilla/buglist.cgi?query_format=advanced&short_desc_type=notregexp&short_desc=CR&product=Multimedia+TDK&version=6.3.0+Multimedia+TDK&version=HB+MME+Alpha+10&version=HB+MME+Alpha+10.01&version=HB+MME+Alpha+10.02&version=HB+MME+Alpha+10.03&version=HB+MME+Alpha+10.1&version=HB+MME+Alpha+10.1.1&version=HB+MME+Alpha+11&version=HB+MME+Alpha+11.1&version=HB+MME+Alpha+11.2&version=HB+MME+Alpha+12&version=HB+MME+Alpha+12.0.1&version=HB+MME+Alpha+12.1&version=HB+MME+Alpha+12.1.1&version=HB+MME+Alpha+12.1.2&version=HB+MME+Alpha+12.1.3&version=HB+MME+Alpha+12.1.4&version=HB+MME+Alpha+12.2&version=HB+MME+Alpha+12.3&version=HB+MME+Alpha+12.4&version=HB+MME+Alpha+12.4.1&version=HB+MME+Alpha+12.5&version=HB+MME+Alpha+12.5.2&version=HB+MME+Alpha+12.5.3&version=HB+MME+Alpha+12.5.4&version=HB+MME+Alpha+12.6&version=HB+MME+Alpha+12.6.1&version=HB+MME+Alpha+12.6.2&version=HB+MME+Alpha+12.7&version=HB+MME+Alpha+12.7.1&version=HB+MME+Alpha+12.7.10&version=HB+MME+Alpha+12.7.11&version=HB+MME+Alpha+12.7.12&version=HB+MME+Alpha+12.7.2&version=HB+MME+Alpha+12.7.3&version=HB+MME+Alpha+12.7.3.1&version=HB+MME+Alpha+12.7.4&version=HB+MME+Alpha+12.7.4.1&version=HB+MME+Alpha+12.7.5&version=HB+MME+Alpha+12.7.6&version=HB+MME+Alpha+12.7.7&version=HB+MME+Alpha+12.7.7+DRA&version=HB+MME+Alpha+12.7.7.1&version=HB+MME+Alpha+12.7.7.10&version=HB+MME+Alpha+12.7.7.2&version=HB+MME+Alpha+12.7.7.3&version=HB+MME+Alpha+12.7.7.4&version=HB+MME+Alpha+12.7.7.5&version=HB+MME+Alpha+12.7.7.6&version=HB+MME+Alpha+12.7.7.7&version=HB+MME+Alpha+12.7.7.8&version=HB+MME+Alpha+12.7.7.9&version=HB+MME+Alpha+12.7.7.D+DRA&version=HB+MME+Alpha+12.7.7.E+DRA&version=HB+MME+Alpha+12.7.7.F+DRA&version=HB+MME+Alpha+12.7.7.G+DRA&version=HB+MME+Alpha+12.7.8&version=HB+MME+Alpha+12.7.9&version=HB+MME+Alpha+12.8&version=HB+MME+Alpha+12.9&version=HB+MME+Alpha+4&version=HB+MME+Alpha+5&version=HB+MME+Alpha+6&version=HB+MME+Alpha+7&version=HB+MME+Alpha+8&version=HB+MME+Alpha+8.1&version=HB+MME+Alpha+8.2&version=HB+MME+Alpha+9&version=HB+MME+Alpha+9.1&version=HB+MME+Alpha+9.2&version=HB+MME+Alpha+9.3&version=HB+MME+Alpha+9.3.1&version=HEAD&version=Mediaware+1.0.0&version=Mediaware+1.0.0+DFD&version=Mediaware+1.1.0&version=Multimedia+TDK+1.1.0&version=Multimedia+TDK+2.0.0&version=unknown&target_milestone=HB+MME+Alpha+10&target_milestone=HB+MME+Alpha+10.01&target_milestone=HB+MME+Alpha+10.02&target_milestone=HB+MME+Alpha+10.03&target_milestone=HB+MME+Alpha+10.1&target_milestone=HB+MME+Alpha+10.1.1&target_milestone=HB+MME+Alpha+11&target_milestone=HB+MME+Alpha+11.1&target_milestone=HB+MME+Alpha+11.2&target_milestone=HB+MME+Alpha+12&target_milestone=HB+MME+Alpha+12.0.1&target_milestone=HB+MME+Alpha+12.1&target_milestone=HB+MME+Alpha+12.1.1&target_milestone=HB+MME+Alpha+12.1.2&target_milestone=HB+MME+Alpha+12.1.3&target_milestone=HB+MME+Alpha+12.1.4&target_milestone=HB+MME+Alpha+12.2&target_milestone=HB+MME+Alpha+12.3&target_milestone=HB+MME+Alpha+12.4&target_milestone=HB+MME+Alpha+12.4.1&target_milestone=HB+MME+Alpha+12.5&target_milestone=HB+MME+Alpha+12.5.2&target_milestone=HB+MME+Alpha+12.5.3&target_milestone=HB+MME+Alpha+12.5.4&target_milestone=HB+MME+Alpha+12.6&target_milestone=HB+MME+Alpha+12.6.1&target_milestone=HB+MME+Alpha+12.6.2&target_milestone=HB+MME+Alpha+12.7&target_milestone=HB+MME+Alpha+12.7.1&target_milestone=HB+MME+Alpha+12.7.10&target_milestone=HB+MME+Alpha+12.7.11&target_milestone=HB+MME+Alpha+12.7.12&target_milestone=HB+MME+Alpha+12.7.2&target_milestone=HB+MME+Alpha+12.7.3&target_milestone=HB+MME+Alpha+12.7.3.1&target_milestone=HB+MME+Alpha+12.7.4&target_milestone=HB+MME+Alpha+12.7.4.1&target_milestone=HB+MME+Alpha+12.7.5&target_milestone=HB+MME+Alpha+12.7.6&target_milestone=HB+MME+Alpha+12.7.7&target_milestone=HB+MME+Alpha+12.7.7+DRA&target_milestone=HB+MME+Alpha+12.7.7.1&target_milestone=HB+MME+Alpha+12.7.7.10&target_milestone=HB+MME+Alpha+12.7.7.2&target_milestone=HB+MME+Alpha+12.7.7.3&target_milestone=HB+MME+Alpha+12.7.7.4&target_milestone=HB+MME+Alpha+12.7.7.5&target_milestone=HB+MME+Alpha+12.7.7.6&target_milestone=HB+MME+Alpha+12.7.7.7&target_milestone=HB+MME+Alpha+12.7.7.8&target_milestone=HB+MME+Alpha+12.7.7.9&target_milestone=HB+MME+Alpha+12.7.7.D+DRA&target_milestone=HB+MME+Alpha+12.7.7.E+DRA&target_milestone=HB+MME+Alpha+12.7.7.F+DRA&target_milestone=HB+MME+Alpha+12.7.7.G+DRA&target_milestone=HB+MME+Alpha+12.7.8&target_milestone=HB+MME+Alpha+12.7.9&target_milestone=HB+MME+Alpha+12.8&target_milestone=HB+MME+Alpha+12.9&target_milestone=HB+MME+Alpha+4&target_milestone=HB+MME+Alpha+5&target_milestone=HB+MME+Alpha+6&target_milestone=HB+MME+Alpha+7&target_milestone=HB+MME+Alpha+8&target_milestone=HB+MME+Alpha+8.2&target_milestone=HB+MME+Alpha+9&target_milestone=HB+MME+Alpha+9.1&target_milestone=HB+MME+Alpha+9.2&target_milestone=HB+MME+Alpha+9.3&target_milestone=HB+MME+Alpha+9.3.1&target_milestone=Mediaware+1.0.0&target_milestone=Mediaware+1.0.0+DFD&target_milestone=Mediaware+1.1.0&target_milestone=Multimedia+TDK+1.2.0&target_milestone=Multimedia+TDK+2.0.0&target_milestone=none&long_desc_type=substring&long_desc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&status_whiteboard_type=allwordssubstr&status_whiteboard=&keywords_type=substring&keywords=&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&flagtype=Customer&emailtype1=substring&email1=&emailtype2=substring&email2=&bugidtype=include&bug_id=&chfieldfrom=2008-01-07&chfieldto=Now&chfield=bug_status&chfield=resolution&chfieldvalue=&cmdtype=doit&order=Reuse+same+sort+as+last+time&field0-0-0=noop&type0-0-0=noop&value0-0-0=\fs6\par
\fs20 someone@qnx.com\par
ohLookAPassword\par
mme_patch_build12.9.6_rel.sgm\par
12.9.6\par
12.9.7\par
Fixed and verified in this release\par
Add: (Status==VERI || Status==CLOS)\par
1\par
Fixed in this release\par
Add: (Resolution==FIXE || Resolution==NOIN || Resolution==DUPL) && (Status!=VERI && Status!=CLOS && Status!=RESO) && ('Assigned-To'!='hbas_support_contact@qnx.com' || ('Assigned-To'=='hbas_support_contact@qnx.com' && Resolution==NONE))\par
0\par
Not reproducible in this release\par
Add: (Resolution==UNRE) && (Status!=VERI && Status!=CLOS) && ('Assigned-To'!='hbas_support_contact@qnx.com' || ('Assigned-To'=='hbas_support_contact@qnx.com' && Resolution==NONE)) && (Timestamp==current)\par
0\i0\par
\par
\b\fs28 Examples - Multiple Section Similarities\b0\fs20\par
\pard\nowidctlpar\f0 Here is an example of how to deal with similarities between multiple sections. While this is specific, it should provide the logic outlining what you can do to handle a similar situation. Make sure to pay attention to the == and !=, they are essential and can cause many problems if used inplace of each other.\par
\par
Lets say you have a condition where all emails Assigned-To HBAS have their own sections. So for each section you have;\par
\par
('Assigned-To'=='hbas_support_contact@qnx.com')\par
\par
Attached to each section for HBAS would be that exception, and everything that doesn't have HBAS would have;\par
\par
('Assigned-To'!='hbas_support_contact@qnx.com')\par
\par
Attached to them (Notice != not ==). However, lets say this is only the case when the Resolution is null (We use NONE as notation for no value). You would change all the HBAS sections to;\par
\par
('Assigned-To'=='hbas_support_contact@qnx.com' && Resolution!=NONE)\par
\par
And the sections would be changed to;\par
\par
('Assigned-To'!='hbas_support_contact@qnx.com' || ('Assigned-To'=='hbas_support_contact@qnx.com' && Resolution==NONE))\par
\par
Which means to say "Either its not HBAS, or its HBAS but it has a null resolution. This can be simplified to;\par
\par
('Assigned-To'!='hbas_support_contact@qnx.com' || Resolution==NONE)\par
\par
This means implicitly the same thing. Also not, that if you have a clause that uses Resolution in such a way that it can't be Resolution==NONE, then you don't need that part (it will never happen). For instance;\par
\par
Resolution==FIXE && ('Assigned-To'!='hbas_support_contact@qnx.com')\par
\par
Here the resolution must be FIXE, so there is no need to have Resolution checked for NONE, since it cannot be both at the same time.\f1\par
}
 